package org.example.sort;
//选择排序算法思想
//基本原理
//选择最值：在未排序的部分中找到最小（或最大）元素
//放置到位：将找到的最值元素与未排序部分的第一个元素交换位置
//逐步缩小范围：每完成一次选择和交换，已排序部分增加一个元素
//重复执行：对剩余未排序部分重复上述过程，直到整个数组有序
//核心特点
//直观易懂：算法思路简单明了，容易理解和实现
//原地排序：只需要常数级别的额外空间
//不稳定排序：相等元素的相对位置可能会改变
//固定交换次数：无论输入数据如何，交换次数都是固定的
public class ChooseSort {
    //选择排序
    public static void selectionSort(int[] arr){
        int n = arr.length;
        //遍历所有元素
        for (int i = 0; i < n - 1; i++) {
            //假设当前元素是最小值
            int minIndex = i;
            //在未排序部分找到真正的最小值
            for(int j = i + 1; j < arr.length; j++){
                if(arr[j] < arr[minIndex]){
                    minIndex = j;
                }
            }
            //将最小值交换一下
            if(minIndex != i){
                int temp = arr[minIndex];
                arr[minIndex] = arr[i];
                arr[i] = temp;
            }
        }
    }
    //主函数
    public static void main(String[] args) {
        int[] arr = {64, 25, 12, 22, 11};
        System.out.println("排序前:");
        printArray(arr);
        System.out.println("排序后:");
        selectionSort(arr);
        printArray(arr);
    }

    //打印数组
    public static void printArray(int[] arr){
        for (int value : arr) {
            System.out.print(value + ",");
        }
        System.out.println();
    }
}
